#include "Interfejs.h"

#include <iostream>
#include <vector>
#include <string>
Interfejs::Interfejs(ALLEGRO_EVENT_SOURCE * sr)
{
	stanGry=MENU;
	typGry=CvC;
	gra=NULL;
	ustawienie=false;
	algorytm=2;
	glebokosc=5;
	rozpoczyna=GRACZ_1;
	rozmiarPlanszy=4;
	rozmiarX=XEkranu;
	rozmiarY=YEkranu;
	
	liczbaPionow1=0;
	liczbaPionow2=0;

	eq=al_create_event_queue();
	al_register_event_source(eq,sr);

	

	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/logo.bmp"),NULL,MENU));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/nowagra.bmp"),al_load_bitmap("bmp/nowagrah.bmp"),MENU,&Interfejs::NowaGra,NULL));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/pomoc.bmp"),al_load_bitmap("bmp/pomoch.bmp"),MENU,&Interfejs::Pomoc,NULL));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/koniec.bmp"),al_load_bitmap("bmp/koniech.bmp"),MENU,&Interfejs::Zakoncz,NULL));
	
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/trybgry.bmp"),al_load_bitmap("bmp/trybgryh.bmp"),MENUGRA,&Interfejs::TrybShift,&Interfejs::TrybWypisz));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/algorytm.bmp"),al_load_bitmap("bmp/algorytmh.bmp"),MENUGRA,&Interfejs::AlgorytmShift,&Interfejs::AlgorytmWypisz));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/poziom.bmp"),al_load_bitmap("bmp/poziomh.bmp"),MENUGRA,&Interfejs::PoziomShift,&Interfejs::PoziomWypisz));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/ustawienie.bmp"),al_load_bitmap("bmp/ustawienieh.bmp"),MENUGRA,&Interfejs::UstawienieShift,&Interfejs::UstawienieWypisz));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/rozpoczyna.bmp"),al_load_bitmap("bmp/rozpoczynah.bmp"),MENUGRA,&Interfejs::RozpoczynaShift,&Interfejs::RozpoczynaWypisz));
	

	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/rozmiar.bmp"),al_load_bitmap("bmp/rozmiarh.bmp"),MENUGRA,&Interfejs::RozmiarShift,&Interfejs::RozmiarWypisz));

	
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/wygral1.bmp"),NULL,WYGRANA1,NULL,NULL,-1,rozmiarY/2-40));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/wygral2.bmp"),NULL,WYGRANA2,NULL,NULL,-1,rozmiarY/2-40));

	ALLEGRO_BITMAP * gracz1Temp=al_load_bitmap("bmp/gracz1.bmp");

	bitmapy.push_back(ELEMENT_UI(gracz1Temp,NULL,GRA,NULL,NULL,-1,rozmiarY-al_get_bitmap_height(gracz1Temp),&turaGracza1));
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/gracz2.bmp"),NULL,GRA,NULL,NULL,-1,0,&turaGracza2));

	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/podpowiedz.bmp"),al_load_bitmap("bmp/podpowiedzh.bmp"),GRA,&Interfejs::Podpowiedz,NULL,rozmiarX*3/4-80,rozmiarY-al_get_bitmap_height(gracz1Temp)));

	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/start.bmp"),al_load_bitmap("bmp/starth.bmp"),MENUGRA,&Interfejs::ResetGry,NULL));
	
	bitmapy.push_back(ELEMENT_UI(al_load_bitmap("bmp/ustaw.bmp"),al_load_bitmap("bmp/ustawh.bmp"),MENUGRA,&Interfejs::ResetUstaw,NULL,rozmiarX-200,rozmiarY-60));
	
	czcionka=al_load_ttf_font("times.ttf",15,0);

}

void Interfejs::PobierzMysz()
{
	ALLEGRO_MOUSE_STATE ms;
	al_get_mouse_state(&ms);
	mysz.x=ms.x;
	mysz.y=ms.y;
	LPM=ms.buttons&1;
	PPM=ms.buttons&2;
}

void Interfejs::ObsluzMysz()
{
	PobierzMysz();

	ALLEGRO_EVENT * ev=new ALLEGRO_EVENT();

	if(al_get_next_event(eq,ev))
	if(ev->display.type==ALLEGRO_EVENT_DISPLAY_CLOSE)
		stanGry=KONIEC;

	if(stanGry==GRA)
	{
		//Sprawdzmy czy mysz znajduje sie w polu gry
		std::pair<WSPOLRZEDNE_EKRANOWE,WSPOLRZEDNE_EKRANOWE> krawedz=gra->plansza->KrawedziePlanszy();
		if(typGry!=CvC)
		if (krawedz.first.x<mysz.x&&krawedz.second.x>mysz.x&&krawedz.first.y<mysz.y&&krawedz.second.y>mysz.y)
		{
			gra->plansza->Podswietlaj(true);
			gra->plansza->UstawPodswietlenie(mysz);
			if(LPM)
			{
				gra->AktualnyGracz()->ObslugaMyszy(mysz);
			}
			if(PPM)
			{
				gra->plansza->Zaznaczaj(false);
			}

		}
	}

	if(stanGry==USTAWIANIE)
	{
		std::pair<WSPOLRZEDNE_EKRANOWE,WSPOLRZEDNE_EKRANOWE> krawedz=gra->plansza->KrawedziePlanszy();
		{
			if (krawedz.first.x<mysz.x&&krawedz.second.x>mysz.x&&krawedz.first.y<mysz.y&&krawedz.second.y>mysz.y)
			{
				gra->plansza->Podswietlaj(true);
				gra->plansza->UstawPodswietlenie(mysz);
				if(LPM)
				{
					if(gra->plansza->UstawPiona(gra->plansza->WspolrzednePlanszy(WSPOLRZEDNE_EKRANOWE(mysz.x,mysz.y)),GRACZ_1))
						liczbaPionow1++;
				}
				if(PPM)
				{
					if(gra->plansza->UstawPiona(gra->plansza->WspolrzednePlanszy(WSPOLRZEDNE_EKRANOWE(mysz.x,mysz.y)),GRACZ_2))
						liczbaPionow2++;
				}

		}
		}

	}

	for(std::vector<ELEMENT_UI>::iterator i=bitmapy.begin();i!=bitmapy.end();i++)
	{
		if(i->stan!=BEZHOVERA)
			i->stan=NORMALNY;

		if(i->LGx!=0&&i->kiedyWyswietlana==stanGry&&i->funkcjaStanu!=NULL)
			(this->*i->funkcjaStanu)(i->LGx+i->sizeX,i->LGy+i->sizeY/3);
		if(i->kiedyWyswietlana==stanGry&&mysz.x>i->LGx&&mysz.x<i->LGx+i->sizeX&&mysz.y>i->LGy&&mysz.y<i->LGy+i->sizeY)
		{
			if(i->stan!=BEZHOVERA)
				i->stan=HOVER;
			if((LPM||PPM)&&i->funkcja!=NULL)
			{
				al_rest(0.2);
				(this->*(i->funkcja))();	

			}



		}
	}
	gra->plansza->Podswietlaj(false);

}

void Interfejs::Start()
{
	gra=new Gra(&stanGry,&typGry,rozmiarPlanszy,glebokosc,rozpoczyna,algorytm,false);
	


	ALLEGRO_KEYBOARD_STATE keystate;

	al_get_keyboard_state(&keystate);
	while(stanGry)
	{

		al_get_keyboard_state(&keystate);
		if(al_key_down(&keystate,ALLEGRO_KEY_ESCAPE))
		switch(stanGry)
		{
			case POMOC:	stanGry=MENU;break;
			case WYGRANA1:	stanGry=MENU;break;
			case WYGRANA2:	stanGry=MENU;break;
			case GRA: stanGry=MENU; break;
			case USTAWIANIE:  stanGry=MENU; break;
		}
			

		al_clear_to_color(al_map_rgb(4,2,4));

		if(stanGry==USTAWIANIE)
		{
			gra->plansza->Rysuj();
		//	ObsluzMysz();
		
			if(liczbaPionow1+liczbaPionow2==rozmiarPlanszy*2)
			{
	
				stanGry=GRA;

			}
		}	

	    UstalAktualnegoGracza();
		ObsluzMysz();
		WyswietlMenu();

		if(stanGry==GRA)
		{
			gra->plansza->Rysuj();
			ZarzadzajTura();
			

		}

		al_flip_display();	

	}
//	gra->gracz1->ZapiszTH();
//	gra->gracz2->ZapiszTH();

}	

Interfejs::~Interfejs()
{
	if (gra!=NULL)
		delete gra;
	
	
}

bool_ Interfejs::ZarzadzajTura()
{
	if(gra->AktualnyGracz()->StanTury())
	{
		if(	SprawdzZwyciestwo())
		{
			if(gra->AktualnyGracz()->Id()==GRACZ_1)
				stanGry=WYGRANA2;
			else
				stanGry=WYGRANA1;
			return true;
		}
		else 		
		{
			
		al_clear_to_color(al_map_rgb(4,2,4));

			WyswietlKolejnegoGracza();
			WyswietlMenu();
			gra->plansza->Rysuj();
		al_flip_display();
		gra->ZmienTure();
		
		}
		std::vector<RUCH> ruchy=gra->plansza->GenerujRuchy(gra->AktualnyGracz()->Id());
		//for(std::vector<RUCH>::iterator it=ruchy.begin();it!=ruchy.end();it++)
			//std::cout<<"Gracz: "<<gra->AktualnyGracz()->Id()<<" "<<*it;
		
	}

	return false;
}



TURA Interfejs::SprawdzZwyciestwo()
{
	//std::cout<<"Dostepne Ruchy: "<<gra->plansza->IloscDostepnychRuchow(gra->AktualnyGracz()->Id())<<std::endl;
	if(!gra->plansza->IloscDostepnychRuchow((TURA)-(gra->AktualnyGracz()->Id())))
		return gra->AktualnyGracz()->Id();
	else return PUSTE;
}

void Interfejs::WyswietlNapis(ELEMENT_UI * bmp, int y, int x)
{
	if(x==-1)
	{
		al_draw_bitmap(bmp->stan==HOVER?bmp->hoverBmp:bmp->bmp,rozmiarX/2-bmp->sizeX/2,y,0);
		bmp->LGx=rozmiarX/2-bmp->sizeX/2;
		bmp->LGy=y;
	}
	else
	{
		al_draw_bitmap(bmp->stan==HOVER?bmp->hoverBmp:bmp->bmp,x,y,0);
		bmp->LGx=x;
		bmp->LGy=y;
	}
}

void Interfejs::WyswietlMenu()
{
	int y=50;
	if(stanGry==MENUGRA)
		y=0;
	for(std::vector<ELEMENT_UI>::iterator i=bitmapy.begin();i!=bitmapy.end();i++)
	{
		if(stanGry==MENUGRA&&i->kiedyWyswietlana==MENUGRA)
		{
			WyswietlNapis(&*i,i->LGy==-1?y:i->LGy,i->LGx==-1?rozmiarX/2-i->sizeX:i->LGx);
			y+=i->sizeY;
		}
		else
		if(i->kiedyWyswietlana==stanGry)
		{
			if(i->Wyswietlaj())
			{
				WyswietlNapis(&*i,i->LGy==-1?y:i->LGy,i->LGx);
				y+=i->sizeY;
			}
		}
	}

	if(stanGry==GRA)
	{
		y=gra->plansza->KrawedziePlanszy().first.y;
		int i=0;
		for(std::list<std::pair<TURA,RUCH> >::iterator it=gra->plansza->wykonaneRuchy.begin();it!=gra->plansza->wykonaneRuchy.end(),i<21;it++,i++)
		{
			if(i==gra->plansza->wykonaneRuchy.size())
				break;
			//if(it->first!=PUSTE)
			//{
			al_set_blender(ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, it->first==GRACZ_1?al_map_rgb(0,255,0):al_map_rgb(0,0,255));
			
	    	al_draw_textf(czcionka,gra->plansza->KrawedziePlanszy().second.x+40,y,0,"%s",it->first==GRACZ_1?"Gracz 2":"Gracz 1");
			
			al_set_blender(ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, al_map_rgb(255,255,255));
	 		al_draw_textf(czcionka,gra->plansza->KrawedziePlanszy().second.x+105,y,0,"%s",it->second.ToString().c_str()) ;
			//}
		/*	else
			{
				al_set_blender(ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, al_map_rgb(255,0,0));
				al_draw_textf(czcionka,gra->plansza->KrawedziePlanszy().second.x+105,y,0,"%s","COFNIETO") ;
						al_set_blender(ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, al_map_rgb(255,255,255));
			}*/
			y+=al_get_font_line_height(czcionka)+2;
		}
		
	}
	else
	////al_draw_bitmap(przyciskNowaGra,0,0,0);
	if(stanGry==POMOC)
	{
		std::string  pomoc [10];
		pomoc[0]="Celem gry jest pozbawienie przeciwnika mozliwosci ruchu. Przesuniecie piona mozliwe jest po prostej (skosnie lub prostpadle). ";
		pomoc[1]="Pionek zatrzymuje sie po napotkaniu przeszkody (innego pionka lub krawedzi planszy), nie mozna zatem zatrzymac sie w ";
		pomoc[2]="polowie ruchu. Pionek po ruchu, przejmuje pionki przeciwnika na prostopadle przylegajacych polach.";
		pomoc[3]=" ";
		pomoc[4]="Ruch wykonuje sie poprzez wybranie pionka za pomoca lewego przycisku myszy, a nastepnie wskazanie pola docelowe.";
		pomoc[5]="Nacisniecie przycisku Podpowiedz, powoduje wyswietlenie wszystkich mozliwosci ruchu dla danego gracza.";
		pomoc[6]=" ";
		pomoc[7]="Przedmiot: Sztuczna Inteligencja, semestr 3, Politechnika Poznanska.";
		pomoc[8]="Poznan, Styczen 2010";
		pomoc[9]="Krzysztof Bogacz, Michal Cmil";

		for (int i=0;i<10;i++)
		{
			al_draw_textf(czcionka,10,i*al_get_font_line_height(czcionka),0,pomoc[i].c_str());
		}


	}
	
	if(stanGry==WYGRANA1||stanGry==WYGRANA2||stanGry==POMOC)
		al_draw_textf(czcionka,rozmiarX/2-al_get_text_width(czcionka,"Nacisnij escape aby powrocic do menu")/2,rozmiarY-al_get_font_line_height(czcionka),0,"Nacisnij escape aby powrocic do menu");
	
	if(stanGry==USTAWIANIE)
	{
		al_draw_textf(czcionka,rozmiarX/2-al_get_text_width(czcionka,"Pozostalo   pionow")/2,rozmiarY-2*al_get_font_line_height(czcionka),0,"Pozostalo %d pionow",rozmiarPlanszy*2-liczbaPionow1-liczbaPionow2);
		al_draw_textf(czcionka,rozmiarX/2-al_get_text_width(czcionka,"Nacisnij escape aby powrocic do menu")/2,rozmiarY-al_get_font_line_height(czcionka),0,"Nacisnij escape aby powrocic do menu");
	}

	//al_draw_rectangle(325,200,475,250,al_map_rgb(99,99,99),1);
}